home *** CD-ROM | disk | FTP | other *** search
/ BCI NET / BCI NET Dec 94.iso / archives / networking / amitcp / httpd.lha / httpd / http_alias.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-18  |  2.2 KB  |  106 lines

  1. /*
  2.  * http_alias.c: Stuff for dealing with directory aliases
  3.  * 
  4.  * Rob McCool
  5.  * 
  6.  */
  7.  
  8.  
  9. #include "httpd.h"
  10.  
  11. typedef struct {
  12.     char fake[MAX_STRING_LEN];
  13.     char real[MAX_STRING_LEN];
  14.     int script;
  15. } alias;
  16.  
  17. static int num_a = 0;
  18. static alias a[MAX_ALIASES];
  19. static int num_v = 0;
  20. static alias v[MAX_ALIASES];
  21.  
  22. void reset_aliases() {
  23.     num_a = 0;
  24.     num_v = 0;
  25. }
  26.  
  27. void add_alias(char *f, char *r, int is_script) {
  28.     strcpy(a[num_a].fake,f);
  29.  
  30.     a[num_a].script = is_script;
  31.     if(r[0] != '/') 
  32.         make_full_path((is_script ? server_root : document_root),r,
  33.                        a[num_a++].real);
  34.     else
  35.         strcpy(a[num_a++].real,r);
  36. }
  37.  
  38. void add_redirect(char *f, char *url) {
  39.     strcpy(v[num_v].fake,f);
  40.     strcpy(v[num_v++].real,url);
  41. }
  42.  
  43. int translate_name(char *name, FILE *fd) {
  44.     register int x,l;
  45.     char dname[MAX_STRING_LEN];
  46.     char w[MAX_STRING_LEN];
  47.     char t[MAX_STRING_LEN];
  48.     struct passwd *pw;
  49.  
  50.     getparents(name);
  51.  
  52.     for(x=0;x<num_v;x++) {
  53.         l=strlen(v[x].fake);
  54.         if(!strncmp(name,v[x].fake,l)) {
  55.             strsubfirst(l,name,v[x].real);
  56.             return -1;
  57.         }
  58.     }
  59.  
  60.     for(x=0; x < num_a; x++) {
  61.         l=strlen(a[x].fake);
  62.         if(!strncmp(name,a[x].fake,l)) {
  63.             strsubfirst(l,name,a[x].real);
  64.             return(a[x].script);
  65.         }
  66.     }
  67.  
  68.     if((user_dir[0]) && (name[0] == '/') && (name[1] == '~')) {
  69.         strcpy(dname,&name[2]);
  70.         getword(w,dname,'/');
  71.         if(!(pw=getpwnam(w)))
  72.             die(NOT_FOUND,name,fd);
  73.         make_full_path(pw->pw_dir,user_dir,t);
  74.         make_full_path(t,dname,name);
  75.         return 0;
  76.     }
  77.     /* no alias, add document root */
  78.     strsubfirst(0,name,document_root);
  79.     return 0;
  80. }
  81.  
  82. void unmunge_name(char *name) {
  83.     register int x,l;
  84.  
  85.     l=strlen(document_root);
  86.     if(!strncmp(name,document_root,l)) {
  87.         strsubfirst(l,name,"");
  88.         if(!name[0]) {
  89.             name[0] = '/';
  90.             name[1] = '\0';
  91.         }
  92.         return;
  93.     }
  94.     for(x=0;x < num_a; x++) {
  95.         l=strlen(a[x].real);
  96.         if(!strncmp(name,a[x].real,l)) {
  97.             strsubfirst(l,name,a[x].fake);
  98.             if(!name[0]) {
  99.                 name[0] = '/';
  100.                 name[1] = '\0';
  101.             }
  102.             return;
  103.         }
  104.     }
  105. }
  106.